home *** CD-ROM | disk | FTP | other *** search
/ PC World 2001 October / PCWorld_2001-10_cd.bin / Software / TemaCD / 3dcanvas / 3DCanv13.CAB / Export DirectX.CS < prev    next >
Text File  |  2001-08-12  |  33KB  |  1,061 lines

  1. Language = VBScript
  2.  
  3. '*********************************************************************************
  4. ' Purpose:  Exports the scene in DirectX format.
  5. '           Determine the file to be exported to.
  6. '*********************************************************************************
  7.  
  8. Option Explicit          'require variable declarations
  9.  
  10. Private mCanvasApp       'provide the CanvasApp object to the entire module
  11.  
  12. Sub Main (CanvasApp)
  13.  
  14.     Dim ExportFileName
  15.     Dim FileSystemObject
  16.     Dim FileObject
  17.     Dim CommonDialog
  18.     Const cdlOFNHideReadOnly = &H4
  19.     Const cdlOFNPathMustExist = &H800
  20.     Const cdlOFNOverwritePrompt = &H2
  21.     Const ErrorCancelSelected = 32755
  22.     Dim Scene
  23.     Dim Canceled
  24.  
  25.     'there are useful functions provided by the CanvasApp so make it
  26.     'available to the whole module
  27.     Set mCanvasApp = CanvasApp
  28.  
  29.     On Error Resume Next
  30.     Set CommonDialog = CreateObject("MSComDlg.CommonDialog")
  31.  
  32.     'if an error occured then user doesn't have MSComDlg available
  33.     If Err.Number <> 0 Then
  34.         Err.Clear
  35.         On Error Goto 0
  36.  
  37.         'since MSComDlg was missing we will default a file name
  38.         ExportFileName = "c:\export.x"
  39.  
  40.         'let the user know where we are putting the file
  41.         MsgBox "Scene will be exported to """ & ExportFileName & """"
  42.  
  43.         Canceled = False
  44.     Else
  45.         On Error Goto 0
  46.         With CommonDialog
  47.  
  48.             'start with no file name at all
  49.             .FileName = ""
  50.  
  51.             'allocate the required space
  52.             .MaxFileSize = 256
  53.  
  54.             'the path must exist, can't be read only, and should warn about overwriting
  55.             .flags = cdlOFNPathMustExist Or cdlOFNHideReadOnly Or cdlOFNOverwritePrompt
  56.                 
  57.             'we want only X
  58.             .Filter = "DirectX (*.X)|*.X"
  59.  
  60.             'call it an error if someone cancels
  61.             .CancelError = True
  62.  
  63.             'show the save box
  64.             On Error Resume Next
  65.             .ShowSave
  66.  
  67.             'Check to see if they canceled
  68.             If Err.Number = 0 Then
  69.                 ExportFileName = .FileName 
  70.                 Canceled = False
  71.             Else
  72.                 Canceled = True
  73.             End if
  74.  
  75.         End With
  76.     End If
  77.  
  78.     'if they didn't cancel
  79.     If Not Canceled Then
  80.         On Error Goto 0    
  81.  
  82.         'get a file system object
  83.         Set FileSystemObject = CreateObject("Scripting.FileSystemObject")
  84.  
  85.         'create a file
  86.         Set FileObject = FileSystemObject.CreateTextFile(ExportFileName, True)
  87.  
  88.         'get the scene
  89.         Set Scene = CanvasApp.GetActiveScene
  90.  
  91.         'write the scene
  92.         ExportScene FileObject, Scene
  93.  
  94.         'close the file
  95.         FileObject.Close
  96.  
  97.         'tell them we are done
  98.         MsgBox "File Export Complete"
  99.  
  100.     End If
  101.  
  102. End Sub
  103.  
  104. '*********************************************************************************
  105. ' Purpose: Main Export Function
  106. '*********************************************************************************
  107.  
  108. Sub ExportScene (FileObject, Scene)
  109.  
  110.  
  111.     Dim RootFrame
  112.  
  113.     'Write the header
  114.     WriteHeader FileObject
  115.  
  116.     'Write Materials
  117.     WriteMaterials FileObject, Scene
  118.  
  119.     'Get the Scene Frame
  120.     Set RootFrame = Scene.GetRootFrame
  121.  
  122.     'Write the Scene
  123.     WriteFrame FileObject, RootFrame, 0
  124.  
  125.     'Write the Animation Information as an AnimationSet
  126.     WriteAnimationSet FileObject, RootFrame
  127.  
  128.  
  129. End Sub
  130.  
  131. '*********************************************************************************
  132. ' Purpose: Write the DirectX Header
  133. '*********************************************************************************
  134.  
  135. Sub WriteHeader (FileObject)
  136.  
  137.     'write the DirectX required header
  138.     FileObject.WriteLine("xof 0302txt 0032")
  139.     FileObject.WriteLine("Header {1; 0; 1;}")
  140.  
  141.     'write a blank line
  142.     FileObject.WriteBlankLines(1) 
  143.     
  144.     'write a comment indicating that the scene was created by 3D Canvas
  145.     FileObject.WriteLine("// Created by 3D Canvas")
  146.     
  147.     'write a blank line
  148.     FileObject.WriteBlankLines(1) 
  149.  
  150. End Sub
  151.  
  152. '*********************************************************************************
  153. ' Purpose: Write the materials.
  154. '*********************************************************************************
  155.  
  156. Sub WriteMaterials (FileObject, Scene)
  157.  
  158.     Dim ObjectCount    'Number of objects in the scene
  159.     Dim ObjectIndex    'Index of Object being processed
  160.     Dim Object         'Object being processed
  161.     Dim MaterialCount  'Number of material for an object
  162.     Dim MaterialIndex  'Index of the Material being processed
  163.     Dim Material       'Material being processed
  164.  
  165.     'Get the Object Count
  166.     ObjectCount = Scene.GetObjectCount
  167.  
  168.     'run through the objects one at a time
  169.     For ObjectIndex = 0 to ObjectCount - 1
  170.  
  171.         'get the object
  172.         Set Object = Scene.GetObject(ObjectIndex)
  173.         
  174.         'get the number of materials used by the object
  175.         MaterialCount = Object.GetMaterialCount
  176.  
  177.         'run through the materials exporting one material at a time
  178.         For MaterialIndex = 0 to MaterialCount - 1
  179.             'get the Material
  180.             Set Material = Object.GetMaterial(MaterialIndex)
  181.     
  182.             WriteIndividualMaterial FileObject, Material, Object.GetID, MaterialIndex
  183.         Next 
  184.  
  185.     Next
  186.  
  187. End Sub
  188.  
  189.  
  190. '*********************************************************************************
  191. ' Purpose: Write an individual material
  192. '*********************************************************************************
  193.  
  194. Sub WriteIndividualMaterial (FileObject, Material, ObjectID, MaterialID)
  195.  
  196.     Dim DirectXColorRed
  197.     Dim DirectXColorGreen
  198.     Dim DirectXColorBlue
  199.     Dim DirectXColorAlpha
  200.     Dim DirectXPower
  201.     Dim DirectXSpecularRed
  202.     Dim DirectXSpecularGreen
  203.     Dim DirectXSpecularBlue
  204.     Dim DirectXEmissiveRed
  205.     Dim DirectXEmissiveGreen
  206.     Dim DirectXEmissiveBlue
  207.     Dim CanvasAmbient
  208.     Dim TextureFileName
  209.  
  210.     'get the DirectX equivalents of the material
  211.  
  212.     'the color - this is easy
  213.     Material.GetColor DirectXColorRed, DirectXColorGreen, DirectXColorBlue
  214.  
  215.     'the alpha
  216.     DirectXColorAlpha = Material.GetTranslucent 
  217.     DirectXColorAlpha = 1 - (DirectXColorAlpha / 100)
  218.  
  219.     'the Power
  220.     DirectXPower = Material.GetSpecular
  221.     If DirectXPower <> 0 Then
  222.         DirectXPower = 250 - (DirectXPower * 2.49)
  223.     End If
  224.  
  225.     'the 3D Canvas Ambient - which is Direct3D Emissive
  226.     CanvasAmbient = Material.GetAmbient    
  227.     DirectXEmissiveRed = DirectXColorRed * (CanvasAmbient / 100)
  228.     DirectXEmissiveGreen = DirectXColorGreen * (CanvasAmbient / 100)
  229.     DirectXEmissiveBlue = DirectXColorBlue * (CanvasAmbient / 100)
  230.  
  231.     'output the DirectX material
  232.     FileObject.WriteLine("Material mtx3dc_" & CStr(CLng(ObjectID)) & "_" & CStr(CLng(MaterialID)) & " {")
  233.     FileObject.WriteLine(Space(4) & mCanvasApp.FormatScientific(DirectXColorRed) & ";" & mCanvasApp.FormatScientific(DirectXColorGreen) & ";" & mCanvasApp.FormatScientific(DirectXColorBlue) & ";" & mCanvasApp.FormatScientific(DirectXColorAlpha) & ";;")
  234.     FileObject.WriteLine(Space(4) & mCanvasApp.FormatScientific(DirectXPower) & ";")
  235.     FileObject.WriteLine(Space(4) & mCanvasApp.FormatScientific(1) & ";" & mCanvasApp.FormatScientific(1) & ";" & mCanvasApp.FormatScientific(1) & ";;") 'always white in 3D Canvas
  236.     FileObject.WriteLine(Space(4) & mCanvasApp.FormatScientific(DirectXEmissiveRed) & ";" & mCanvasApp.FormatScientific(DirectXEmissiveGreen) & ";" & mCanvasApp.FormatScientific(DirectXEmissiveBlue) & ";;")
  237.  
  238.  
  239.     'output the texture (if there is any)
  240.     TextureFileName = Material.GetTextureFileName            
  241.     If TextureFileName <> "" Then
  242.         FileObject.WriteLine Space(4) & "TextureFileName {"
  243.         FileObject.WriteLine Space(8) & Chr(34) & TextureFileName & Chr(34) & ";"
  244.         FileObject.WriteLine Space(4) & "}"
  245.     End If
  246.         
  247.     FileObject.WriteLine("}")
  248.  
  249.     'write a blank line
  250.     FileObject.WriteBlankLines(1) 
  251.  
  252. End Sub
  253.  
  254. '*********************************************************************************
  255. ' Purpose: Write a frame.
  256. '          Warning: This uses recursion!
  257. '*********************************************************************************
  258.  
  259. Sub WriteFrame (FileObject, Frame, Level)
  260.     Dim ChildLevel
  261.     Dim Indent
  262.     Dim ChildFrameCount
  263.     Dim ChildFrame
  264.     Dim ChildFrameIndex
  265.     
  266.     'determine the child level
  267.     ChildLevel = Level + 1
  268.     
  269.     'determine the amount of fill
  270.     Indent = Space(Level * 4)
  271.  
  272.     'write the opening frame block
  273.     FileObject.WriteLine(Indent & "Frame x3dc_" & CStr(CLng(Frame.GetID)) & " {")
  274.  
  275.     'write a blank line
  276.     FileObject.WriteBlankLines(1) 
  277.  
  278.     'Write the transformation matrix
  279.     WriteFrameTransformMatrix FileObject, Frame, ChildLevel
  280.     
  281.     'Write the objects that have this frame as a parent
  282.     WriteFrameObjects FileObject, Frame, ChildLevel
  283.     
  284.     'get the # of childrend the frame has
  285.     ChildFrameCount = Frame.GetChildCount
  286.     
  287.     'run throught the children
  288.     For ChildFrameIndex = 0 To ChildFrameCount -1
  289.         Set ChildFrame = Frame.GetChild(ChildFrameIndex)
  290.         
  291.         'Recursion!
  292.         WriteFrame FileObject, ChildFrame, ChildLevel
  293.         
  294.         'release the frame
  295.         Set ChildFrame = Nothing
  296.     Next
  297.     
  298.     'write the closing of the frame block
  299.     FileObject.WriteLine(Indent & "}")
  300.  
  301.     'write a blank line
  302.     FileObject.WriteBlankLines(1) 
  303.     
  304. End Sub
  305.  
  306. '*********************************************************************************
  307. ' Purpose: Write a frame's transform matrix.
  308. '*********************************************************************************
  309.  
  310. Sub WriteFrameTransformMatrix (FileObject, Frame, Level)
  311.     
  312.     Dim Indent
  313.     Dim ParentFrame
  314.     Dim Mat00
  315.     Dim Mat01
  316.     Dim Mat02
  317.     Dim Mat03
  318.     Dim Mat10
  319.     Dim Mat11
  320.     Dim Mat12
  321.     Dim Mat13
  322.     Dim Mat20
  323.     Dim Mat21
  324.     Dim Mat22
  325.     Dim Mat23
  326.     Dim Mat30
  327.     Dim Mat31
  328.     Dim Mat32
  329.     Dim Mat33
  330.     
  331.     'determine the amount of indent
  332.     Indent = Space(Level * 4)
  333.     
  334.     'write the opening mesh block
  335.     FileObject.WriteLine(Indent & "FrameTransformMatrix {")
  336.     
  337.     'get the parent frame
  338.     set ParentFrame = Frame.GetParent 
  339.  
  340.     'if we are at the root of the scene (no parent)
  341.     'then we set the transform matrix ourselves
  342.     If ParentFrame Is Nothing Then
  343.         Mat00 = 1
  344.         Mat11 = 1
  345.         Mat22 = 1
  346.         Mat33 = 1
  347.     Else 'otherwise get the transform matrix
  348.         Frame.GetTransformMatrix ParentFrame _
  349.         , Mat00 _
  350.         , Mat01 _
  351.         , Mat02 _
  352.         , Mat03 _
  353.         , Mat10 _
  354.         , Mat11 _
  355.         , Mat12 _
  356.         , Mat13 _
  357.         , Mat20 _
  358.         , Mat21 _
  359.         , Mat22 _
  360.         , Mat23 _
  361.         , Mat30 _
  362.         , Mat31 _
  363.         , Mat32 _
  364.         , Mat33
  365.     End If
  366.  
  367.     'write the transformation matrix    
  368.     FileObject.WriteLine(Indent & Space(4) & mCanvasApp.FormatScientific(Mat00) & ", " & mCanvasApp.FormatScientific(Mat10) & ", " & mCanvasApp.FormatScientific(Mat20) & ", " & mCanvasApp.FormatScientific(Mat30) & ",")
  369.     FileObject.WriteLine(Indent & Space(4) & mCanvasApp.FormatScientific(Mat01) & ", " & mCanvasApp.FormatScientific(Mat11) & ", " & mCanvasApp.FormatScientific(Mat21) & ", " & mCanvasApp.FormatScientific(Mat31) & ",")
  370.     FileObject.WriteLine(Indent & Space(4) & mCanvasApp.FormatScientific(Mat02) & ", " & mCanvasApp.FormatScientific(Mat12) & ", " & mCanvasApp.FormatScientific(Mat22) & ", " & mCanvasApp.FormatScientific(Mat32) & ",")
  371.     FileObject.WriteLine(Indent & Space(4) & mCanvasApp.FormatScientific(Mat03) & ", " & mCanvasApp.FormatScientific(Mat13) & ", " & mCanvasApp.FormatScientific(Mat23) & ", " & mCanvasApp.FormatScientific(Mat33) & ";;")
  372.     
  373.     'write the closing mesh block
  374.     FileObject.WriteLine(Indent & "}")
  375.  
  376. End Sub
  377.  
  378.  
  379. '*********************************************************************************
  380. ' Purpose: write the objects that are contained in the frame
  381. '*********************************************************************************
  382.  
  383. Sub WriteFrameObjects (FileObject, Frame, Level)
  384.  
  385.     Dim ObjectCount    
  386.     Dim ObjectIndex
  387.     Dim Object
  388.  
  389.     'get the number of objects on this frame
  390.     ObjectCount = Frame.GetObjectCount
  391.  
  392.     'run through the objects exporting them
  393.     For ObjectIndex = 0 to ObjectCount - 1
  394.         'Get the Object
  395.         Set Object = Frame.GetObject(ObjectIndex)        
  396.         
  397.         WriteObject FileObject, Object, Level
  398.     Next
  399.     
  400. End Sub
  401.  
  402. '*********************************************************************************
  403. ' Purpose: write an object
  404. '*********************************************************************************
  405.  
  406. Sub WriteObject (FileObject, Object, Level)
  407.     
  408.     Dim Indent
  409.  
  410.     
  411.     'if the object isn't empty (it could be if the last face was deleted)
  412.     If Object.GetFaceCount > 0 Then
  413.         'determine the amount to indent
  414.         Indent = Space(Level * 4)
  415.         
  416.         'write the opening mesh block
  417.         FileObject.WriteLine (Indent & "Mesh mx3dc_" & CStr(CLng(Object.GetID)) & " {" )
  418.         
  419.         WritePoints FileObject, Object, Level + 1
  420.         WriteFaceMaterials FileObject, Object, Level + 1
  421.         WriteNormals FileObject, Object, Level + 1
  422.         WriteFaceWraps FileObject, Object, Level + 1
  423.         WriteTextureCoordinates FileObject, Object, Level + 1
  424.         WriteSkeletal FileObject, Object, Level
  425.         
  426.         'write the closing mesh block
  427.         FileObject.WriteLine ( Indent & "}" )
  428.     End If
  429.  
  430.     'write a blank line
  431.     FileObject.WriteBlankLines(1) 
  432.  
  433. End Sub
  434.  
  435.  
  436. '*********************************************************************************
  437. ' Purpose: write the points of an object
  438. '*********************************************************************************
  439.  
  440. Sub WritePoints(FileObject, Object, Level)
  441.     
  442.     Dim Indent
  443.     Dim PointCount
  444.     Dim Point
  445.     Dim Delimiter
  446.     Dim X
  447.     Dim Y
  448.     Dim Z
  449.     Dim FaceCount
  450.     Dim FaceIndex
  451.     Dim PointIndex
  452.     Dim Face
  453.     Dim FacePointCount
  454.     Dim FaceData
  455.     
  456.     'determine the amount to indent
  457.     Indent = Space(Level * 4)
  458.     
  459.     'get the number of points in the object
  460.     PointCount = Object.GetPointCount
  461.  
  462.     'write the number of points
  463.     FileObject.WriteLine Indent & CStr(CLng(PointCount)) & ";"
  464.  
  465.     'write the points
  466.     For PointIndex = 0 To PointCount - 1
  467.         
  468.         'if the last point then we need to terminate the line differently
  469.         If PointIndex = PointCount - 1 Then
  470.             Delimiter = ";"
  471.         Else
  472.             Delimiter = ","
  473.         End If
  474.  
  475.         'get the point
  476.         Object.GetPoint PointIndex, X, Y, Z
  477.  
  478.         FileObject.WriteLine Indent & mCanvasApp.FormatScientific(X) & "; " & mCanvasApp.FormatScientific(Y) & "; " & mCanvasApp.FormatScientific(Z) & ";" & Delimiter
  479.         
  480.     Next
  481.  
  482.  
  483.     'get the number of faces in the object
  484.     FaceCount = Object.GetFaceCount
  485.     
  486.     'write the face count
  487.     FileObject.WriteLine Indent & CStr(CLng(FaceCount)) & ";"
  488.  
  489.     'write the faces
  490.     For FaceIndex = 0 to FaceCount -1
  491.  
  492.         'get the face
  493.         Set Face = Object.GetFace(FaceIndex)
  494.  
  495.         'get the number of points in the face
  496.         FacePointCount = Face.GetPointCount        
  497.  
  498.         'the number of points in the face
  499.         FaceData = CStr(CLng(FacePointCount)) & ";"
  500.  
  501.         'run through the points
  502.         For PointIndex = 0 To FacePointCount - 1
  503.             'if we are on the last point we end have a different delimiter
  504.             If PointIndex = FacePointCount - 1 Then
  505.                 Delimiter = ";"
  506.             Else
  507.                 Delimiter = ","
  508.             End If
  509.  
  510.             'get the point
  511.             Point = Face.GetPoint(PointIndex)
  512.             
  513.             'add it to the face data    
  514.             FaceData = FaceData & CStr(CLng(Point)) & Delimiter
  515.         Next
  516.         
  517.         'if we are on the last face, then we end the line differently
  518.         If FaceIndex = FaceCount -1 Then
  519.             Delimiter = ";"
  520.         Else
  521.             Delimiter = ","
  522.         End If
  523.         
  524.         'write the face line
  525.         FileObject.WriteLine Indent & FaceData & Delimiter
  526.  
  527.     Next
  528.  
  529. End Sub
  530.  
  531.  
  532. '*********************************************************************************
  533. ' Purpose: write the materials for a face
  534. '*********************************************************************************
  535.  
  536. Sub WriteFaceMaterials(FileObject, Object, Level)
  537.     
  538.     Dim Indent
  539.     Dim ObjectMaterialCount
  540.     Dim FaceCount
  541.     Dim MaterialIndex
  542.     Dim FaceIndex
  543.     Dim Delimiter
  544.     Dim FaceMaterial
  545.         
  546.     'determine the amount to indent
  547.     Indent = Space(Level * 4)
  548.  
  549.     'get the number of materials
  550.     ObjectMaterialCount = Object.GetMaterialCount
  551.     
  552.     'the header
  553.     FileObject.WriteLine Indent & "MeshMaterialList {"
  554.  
  555.     'the number of materials
  556.     FileObject.WriteLine Indent & Space(4) & CStr(CLng(ObjectMaterialCount)) & ";"
  557.  
  558.     'if there is only one material it can be applied to the whole object
  559.     If ObjectMaterialCount = 1 Then
  560.         FileObject.WriteLine Indent & Space(4) & "1;"
  561.         FileObject.WriteLine Indent & Space(4) & "0;;"
  562.  
  563.     'otherwise each face's material must be written
  564.     Else
  565.  
  566.         'get the number of faces
  567.         FaceCount = Object.GetFaceCount
  568.         
  569.         FileObject.WriteLine Indent & Space(4) & CStr(CLng(FaceCount)) & ";"
  570.         For FaceIndex = 0 To FaceCount - 1
  571.             'get the face
  572.             FaceMaterial = Object.GetFaceMaterialIndex(FaceIndex)
  573.  
  574.             'the last face must have a different delimiter
  575.             If FaceIndex = FaceCount - 1 Then
  576.                 Delimiter = ";;"
  577.             Else
  578.                 Delimiter = ","
  579.             End If
  580.  
  581.             FileObject.WriteLine Indent & Space(4) & CStr(CLng(FaceMaterial)) & Delimiter
  582.         Next
  583.     End If
  584.     
  585.     'the materials
  586.     For MaterialIndex = 0 To ObjectMaterialCount - 1
  587.         FileObject.WriteLine Indent & Space(4) & "{mtx3dc_" & CStr(CLng(Object.GetID)) & "_" & CStr(CLng(MaterialIndex)) & "}"
  588.     Next
  589.         
  590.     'write the closing block
  591.     FileObject.WriteLine Indent & "}"
  592.     
  593. End Sub
  594.  
  595.  
  596. '*********************************************************************************
  597. ' Purpose: write the normals for an object
  598. '*********************************************************************************
  599.  
  600. Sub WriteNormals(FileObject, Object, Level)
  601.  
  602.     Dim Indent
  603.     Dim NormalCount
  604.     Dim Normal
  605.     Dim Delimiter
  606.     Dim X
  607.     Dim Y
  608.     Dim Z
  609.     Dim FaceCount
  610.     Dim FaceIndex
  611.     Dim NormalIndex
  612.     Dim Face
  613.     Dim FaceNormalCount
  614.     Dim FaceData
  615.  
  616.     'determine the amount to indent
  617.     Indent = Space(Level * 4)
  618.         
  619.     'write the normals
  620.     FileObject.WriteLine Indent & "MeshNormals {"
  621.  
  622.     'get the number of normals in the object
  623.     NormalCount = Object.GetNormalCount
  624.  
  625.     'write the number of normals
  626.     FileObject.WriteLine Indent & Space(4) & CStr(CLng(NormalCount)) & ";"
  627.  
  628.     'write the normals
  629.     For NormalIndex = 0 To NormalCount - 1
  630.         
  631.         'if the last normal then we need to terminate the line differently
  632.         If NormalIndex = NormalCount - 1 Then
  633.             Delimiter = ";"
  634.         Else
  635.             Delimiter = ","
  636.         End If
  637.  
  638.         'get the normal
  639.         Object.GetNormal NormalIndex, X, Y, Z
  640.  
  641.         FileObject.WriteLine Indent & Space(4) & mCanvasApp.FormatScientific(X) & "; " & mCanvasApp.FormatScientific(Y) & "; " & mCanvasApp.FormatScientific(Z) & ";" & Delimiter
  642.         
  643.     Next
  644.  
  645.  
  646.     'get the number of faces in the object
  647.     FaceCount = Object.GetFaceCount
  648.     
  649.     'write the face count
  650.     FileObject.WriteLine Indent & Space(4) & CStr(CLng(FaceCount)) & ";"
  651.  
  652.     'write the faces
  653.     For FaceIndex = 0 to FaceCount -1
  654.  
  655.         'get the face
  656.         Set Face = Object.GetFace(FaceIndex)
  657.  
  658.         'get the number of normals in the face
  659.         FaceNormalCount = Face.GetNormalCount        
  660.  
  661.         'the number of normals in the face
  662.         FaceData = CStr(CLng(FaceNormalCount)) & ";"
  663.  
  664.         'run through the normals
  665.         For NormalIndex = 0 To FaceNormalCount - 1
  666.             'if we are on the last normal we end have a different delimiter
  667.             If NormalIndex = FaceNormalCount - 1 Then
  668.                 Delimiter = ";"
  669.             Else
  670.                 Delimiter = ","
  671.             End If
  672.  
  673.             'get the normal
  674.             Normal = Face.GetNormal(NormalIndex)
  675.             
  676.             'add it to the face data    
  677.             FaceData = FaceData & CStr(CLng(Normal)) & Delimiter
  678.         Next
  679.         
  680.         'if we are on the last face, then we end the line differently
  681.         If FaceIndex = FaceCount -1 Then
  682.             Delimiter = ";"
  683.         Else
  684.             Delimiter = ","
  685.         End If
  686.         
  687.         'write the face line
  688.         FileObject.WriteLine Indent & Space(4) & FaceData & Delimiter
  689.  
  690.     Next
  691.         
  692.     'write the closing normal block
  693.     FileObject.WriteLine Indent & "}"
  694.  
  695. End Sub
  696.  
  697. '*********************************************************************************
  698. ' Purpose: write the wrap flags (texture topology) for the faces
  699. '*********************************************************************************
  700.  
  701. Sub WriteFaceWraps(FileObject, Object, Level)
  702.     
  703.     Dim Indent
  704.     Dim Delimiter
  705.     Dim FaceIndex
  706.     Dim Face
  707.     Dim WrapU
  708.     Dim WrapV
  709.     Dim FaceCount    
  710.     
  711.     'determine the amount to indent
  712.     Indent = Space(Level * 4)
  713.         
  714.     'the header
  715.     FileObject.WriteLine Indent & "MeshFaceWraps {"
  716.  
  717.     'the number of faces
  718.     FaceCount = Object.GetFaceCount
  719.     FileObject.WriteLine Indent & Space(4) & CStr(CLng(FaceCount)) & ";"
  720.     
  721.     'write the face wraps
  722.     For FaceIndex = 0 To FaceCount - 1
  723.         
  724.         Set Face = Object.GetFace(FaceIndex)
  725.  
  726.         Face.GetTextureTopology WrapU, WrapV
  727.         
  728.         'a different delimiter for the last face
  729.         If FaceIndex = FaceCount - 1 Then
  730.             Delimiter = ";"
  731.         Else
  732.             Delimiter = ","
  733.         End If
  734.         FileObject.WriteLine Indent & Space(4) & CStr(CLng(WrapU)) & ";; " & CStr(CLng(WrapV)) & ";;" & Delimiter
  735.         
  736.         'release the face
  737.         Set Face = Nothing
  738.     Next
  739.         
  740.     'write the closing texture coordinates block
  741.     FileObject.WriteLine Indent & "}"
  742.     
  743.  
  744. End Sub
  745.  
  746. '*********************************************************************************
  747. ' Purpose: write the texture coordinates for an object
  748. '*********************************************************************************
  749.  
  750. Sub WriteTextureCoordinates(FileObject, Object, Level)
  751.     
  752.     Dim Indent
  753.     Dim Delimiter
  754.     Dim TextureCoordinateIndex
  755.     Dim TextureCoordinateCount
  756.     Dim U 
  757.     Dim V
  758.     
  759.     'determine the amount of fill
  760.     Indent = Space(Level * 4)
  761.         
  762.     'the header
  763.     FileObject.WriteLine Indent & "MeshTextureCoords {"
  764.  
  765.     'get the number of texture coordinates (there is one for each point)
  766.     TextureCoordinateCount = Object.GetPointCount
  767.  
  768.     'write the number of texture coordinates
  769.     FileObject.WriteLine Indent & Space(4) & CStr(CLng(TextureCoordinateCount)) & ";"
  770.     
  771.     'write the coordinates
  772.     For TextureCoordinateIndex = 0 To TextureCoordinateCount - 1
  773.         
  774.         'if the last texture coordinate there is a different delimiter
  775.         If TextureCoordinateIndex = TextureCoordinateCount - 1 Then
  776.             Delimiter = ";"
  777.         Else
  778.             Delimiter = ","
  779.         End If
  780.  
  781.         'get the texture coordinate
  782.         Object.GetPointTextureCoordinate TextureCoordinateIndex, U, V
  783.  
  784.         'write the texture coordinate
  785.         FileObject.WriteLine Indent & Space(4) & mCanvasApp.FormatScientific(U) & "; " & mCanvasApp.FormatScientific(V) & ";" & Delimiter
  786.         
  787.     Next
  788.         
  789.     'write the closing texture coordinates block
  790.     FileObject.WriteLine Indent & "}"
  791.  
  792.  
  793. End Sub
  794.  
  795. '*********************************************************************************
  796. ' Purpose: write the skeletal information for an object
  797. '          warning: this is experimental and incomplete. it is here as an example
  798. '*********************************************************************************
  799.  
  800. Sub WriteSkeletal(FileObject, Object, Level)
  801.     
  802.     Dim BoneCount
  803.     Dim BoneIndex
  804.     Dim Indent
  805.     Dim Bone
  806.     
  807.     'Get the number of bones that affect this object
  808.     BoneCount = Object.GetBoneCount
  809.     
  810.     'if we have any bones that affect this object
  811.     If BoneCount > 0 Then
  812.         'only comments for now
  813.         Indent = "//RemoveMeForLimitedSkeletalInformation//" & Space(Level * 4)
  814.         
  815.         'output the header
  816.         FileObject.WriteBlankLines(1)
  817.         FileObject.WriteLine Indent & "XSkinMeshHeader {"
  818.         FileObject.WriteLine Indent & Space(4) & "1000;  // nMaxSkinWeightsPerVertex (What specifically should this be? Will a really big number do?)"
  819.         FileObject.WriteLine Indent & Space(4) & "1000;  // nMaxSkinWeightsPerFace (What specifically should this be? Will a really big number do?)"
  820.         FileObject.WriteLine Indent & Space(4) & CStr(CLng(BoneCount)) & ";"
  821.         FileObject.WriteLine Indent & "}"
  822.             
  823.         'output the bone effect
  824.         For BoneIndex = 0 to BoneCount - 1
  825.             'get the bone
  826.             Set Bone = Object.GetBone(BoneIndex)
  827.  
  828.             'write the bone effect
  829.             WriteBone FileObject, Bone, Level
  830.  
  831.         Next
  832.     End If
  833.     
  834.  
  835. End Sub
  836.  
  837. '*********************************************************************************
  838. ' Purpose: write the details of a bone
  839. '*********************************************************************************
  840.  
  841. Sub WriteBone(FileObject, Bone, Level)
  842.     
  843.     Dim Indent
  844.     Dim AffectedPointCount
  845.     Dim AffectedPoint
  846.     Dim AffectedPointIndex
  847.     Dim Delimiter
  848.     Dim Frame
  849.     
  850.     AffectedPointCount = Bone.GetAffectedPointCount
  851.     
  852.     'only comments for now
  853.     Indent = "//RemoveMeForLimitedSkeletalInformation//" & Space(Level * 4)
  854.  
  855.     'get the parent frame of this bone
  856.     Set Frame = Bone.GetParentFrame
  857.     
  858.     'output the header
  859.     FileObject.WriteLine Indent & ""
  860.     FileObject.WriteLine Indent & "SkinWeights {"
  861.     FileObject.WriteLine Indent & Space(4) & """x3dc_" & CStr(CLng(Frame.GetID)) & """;"
  862.     FileObject.WriteLine Indent & Space(4) & CStr(CLng(AffectedPointCount)) & ";"
  863.         
  864.     'the vertices affected
  865.     For AffectedPointIndex = 0 To AffectedPointCount - 1
  866.  
  867.         'a different delimiter for the last one
  868.         If AffectedPointIndex = AffectedPointCount - 1 Then
  869.             Delimiter = ";"
  870.         Else
  871.             Delimiter = ","
  872.         End If
  873.  
  874.         'get the point
  875.         AffectedPoint = Bone.GetAffectedPoint(AffectedPointIndex)
  876.         
  877.         FileObject.WriteLine Indent & Space(4) & CStr(CLng(AffectedPoint)) & Delimiter
  878.     Next
  879.     
  880.     'their Weight
  881.     For AffectedPointIndex = 0 To AffectedPointCount - 1
  882.  
  883.         'a different delimiter for the last one
  884.         If AffectedPointIndex = AffectedPointCount - 1 Then
  885.             Delimiter = ";"
  886.         Else
  887.             Delimiter = ","
  888.         End If
  889.         
  890.         FileObject.WriteLine Indent & Space(4) & "1.0" & Delimiter & " //can I output 1.0 for all? (meaning all bones have equal influence)"
  891.     Next
  892.         
  893.     'the transform
  894.     FileObject.WriteLine Indent & Space(4) & "0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0;; //What specifically should this be? I have already said what frame the object is on and the frames involved. Perhaps this is the transformation relative to the world?"
  895.     
  896.     FileObject.WriteLine Indent & "}"
  897.     
  898.  
  899. End Sub
  900.  
  901. '*********************************************************************************
  902. ' Purpose: write the animation set header for a frame
  903. '*********************************************************************************
  904.  
  905. Sub WriteAnimationSet(FileObject, Frame)
  906.  
  907.     'write the opening animation block
  908.     FileObject.WriteLine "AnimationSet x3dc_0 {"
  909.     
  910.     WriteAnimationFrame FileObject, Frame, 0
  911.     
  912.     'write the closing of the block
  913.     FileObject.WriteLine "}"
  914.  
  915.  
  916. End Sub
  917.  
  918. '*********************************************************************************
  919. ' Purpose: write the animation information for a frame 
  920. '          Warning: this uses recursion!
  921. '*********************************************************************************
  922.  
  923. Sub WriteAnimationFrame(FileObject, Frame, Level)
  924.     
  925.     Dim ChildLevel
  926.     Dim ChildFrameCount
  927.     Dim ChildFrameIndex
  928.     Dim ChildFrame
  929.  
  930.     'determine the child level
  931.     ChildLevel = Level + 1
  932.  
  933.     'don't export the root frame
  934.     If Level <> 0 Then
  935.         'write the opening frame block
  936.         FileObject.WriteLine Space(4) & "Animation x3dc_" & CStr(CLng(Frame.GetID)) & " {"
  937.         FileObject.WriteLine Space(8) & "{x3dc_" & CStr(CLng(Frame.GetID)) & "}"
  938.     
  939.         'the animation style    
  940.         FileObject.WriteLine Space(8) & "AnimationOptions { " & CStr(CLng(Frame.GetAnimationStyle)) & "; 0; }"
  941.  
  942.         'write the animation keys            
  943.         WriteAnimationFrameKeys FileObject, Frame
  944.     
  945.         'write the closing of the frame block
  946.         FileObject.WriteLine Space(4) & "}"
  947.     End if
  948.     
  949.     'get the # of childrend the frame has
  950.     ChildFrameCount = Frame.GetChildCount
  951.     
  952.     'run throught the children
  953.     For ChildFrameIndex = 0 To ChildFrameCount -1
  954.         Set ChildFrame = Frame.GetChild(ChildFrameIndex)
  955.         
  956.         'Recursion!
  957.         WriteAnimationFrame FileObject, ChildFrame, ChildLevel
  958.         
  959.         'release the frame
  960.         Set ChildFrame = Nothing
  961.     Next
  962.  
  963.  
  964. End Sub
  965.  
  966. '*********************************************************************************
  967. ' Purpose: write a frame's animation keys
  968. '*********************************************************************************
  969.  
  970. Sub WriteAnimationFrameKeys(FileObject, Frame)
  971.  
  972.     Dim KeyFrameIndex
  973.     Dim KeyFrameCount
  974.     Dim Time
  975.     Dim X        
  976.     Dim Y
  977.     Dim Z
  978.     Dim R
  979.     Dim KeyData
  980.     Dim Delimiter
  981.     
  982.     'get the animation key data for Position
  983.     FileObject.WriteLine Space(8) & "AnimationKey {"
  984.     FileObject.WriteLine Space(12) & "2;"
  985.  
  986.     'get the number of position key frames
  987.     KeyFrameCount = Frame.GetPositionKeyFrameCount
  988.  
  989.     'write the number of keyframes
  990.     FileObject.WriteLine Space(12) & CStr(CLng(KeyFrameCount)) & ";"
  991.     
  992.     'run through the position keyframes
  993.     For KeyFrameIndex = 0 to KeyFrameCount - 1    
  994.         'get the keyframe
  995.         Frame.GetPositionKeyFrame KeyFrameIndex, Time, X, Y, Z
  996.  
  997.         KeyData = Space(12) & CStr(CLng(Time)) & "; " & "3; " & mCanvasApp.FormatScientific(X) & ", " & mCanvasApp.FormatScientific(Y) & ", " & mCanvasApp.FormatScientific(Z) & ";;"
  998.  
  999.         'a different delimiter for the final keyframe
  1000.         If KeyFrameIndex <> KeyFrameCount - 1 Then
  1001.             Delimiter = ","
  1002.         Else
  1003.             Delimiter = ";"
  1004.         End If
  1005.                 
  1006.         FileObject.WriteLine KeyData & Delimiter
  1007.     Next
  1008.  
  1009.     'write the closing item
  1010.     FileObject.WriteLine Space(8) & "}"
  1011.     
  1012.     'get the animation key data for Rotation
  1013.     FileObject.WriteLine Space(8) & "AnimationKey {"
  1014.     FileObject.WriteLine Space(12) & "0;"
  1015.  
  1016.     'get the number of orientation key frames
  1017.     KeyFrameCount = Frame.GetOrientationKeyFrameCount
  1018.  
  1019.     'write the number of keyframes
  1020.     FileObject.WriteLine Space(12) & CStr(CLng(KeyFrameCount)) & ";"
  1021.  
  1022.     'run through the orientation keyframes
  1023.     For KeyFrameIndex = 0 to KeyFrameCount - 1    
  1024.         'get the keyframe
  1025.         Frame.GetOrientationKeyFrame KeyFrameIndex, Time, X, Y, Z, R
  1026.  
  1027.         KeyData = Space(12) & CStr(CLng(Time)) & "; " & "4; " &  mCanvasApp.FormatScientific(R) & ", " & mCanvasApp.FormatScientific(X) & ", " & mCanvasApp.FormatScientific(Y) & ", " & mCanvasApp.FormatScientific(Z) & ";;"
  1028.  
  1029.         'a different delimiter for the final keyframe
  1030.         If KeyFrameIndex <> KeyFrameCount - 1 Then
  1031.             Delimiter = ","
  1032.         Else
  1033.             Delimiter = ";"
  1034.         End If
  1035.                 
  1036.         FileObject.WriteLine KeyData & Delimiter
  1037.     Next
  1038.  
  1039.     'write the closing item
  1040.     FileObject.WriteLine Space(8) & "}"
  1041.  
  1042. End Sub
  1043.  
  1044.  
  1045.  
  1046.  
  1047.  
  1048.  
  1049.  
  1050.  
  1051.  
  1052.  
  1053.  
  1054.  
  1055.  
  1056.  
  1057.  
  1058.  
  1059.  
  1060.  
  1061.